#!/usr/bin/env python
# -*- coding: UTF-8 -*-
'''
@Project ：图灵学习 
@File    ：20.线程回顾-as_completed.py
@IDE     ：PyCharm 
@Author  ：ChenLiGao
@Date    ：2024-11-04 15:56
'''
import time
from concurrent.futures import ThreadPoolExecutor, as_completed, wait


def get_num(num):
    time.sleep(num)
    print(f"数字：{num}")
    return num

time_attr_list = [3, 1, 4, 2]
time_attr_list1 = [5, 9, 6]


pool = ThreadPoolExecutor(max_workers=2)

future_list = [pool.submit(get_num, time_attr) for time_attr in time_attr_list]

# # 1.获取任务返回值的第一种方式：根据上传任务的顺序获取任务返回值
# for future in future_list:
#     print(future.result())
# print("*" * 100)


# # 2.获取任务返回值的第二种方式：谁先完成谁先返回
# for future in as_completed(future_list):
#     # 如果其中的任务已经拿到返回值则立即返回
#     print("任务返回值：", future.result())
# print("*" * 100)

# # 3.将任务的参数批次传入：map批次传递参数
# results = pool.map(get_num, time_attr_list) # map返回的值类型是生成器对象
#
# print(results)
#
# for temp in results:
#     print(temp) # 如果通过map的方式提交任务，则打印任务的返回值无需调用result方法
# print("*" * 100)

# 4.让主线程等待所有的子线程任务全部完成之后主线程解堵塞
all_task = [pool.submit(get_num, time_attr) for time_attr in time_attr_list]
# 先让所有的子线程任务全部完成之后才执行主线程中的代码
wait(all_task)
print("*" * 100)

print("主线程执行......")
"""
1.创建线程池
2.设置线程池最大线程数
3.如果像线程池提交任务：submit，map
4.什么是future对象
5.可以通过future对象获取任务的返回值
6.如果实现任务完成后立即返回结果：as_completed
7.如何让主线程堵塞：wait
8.map方法返回的是一个生成器，生成器对象中包含了所有任务的返回值，返回值的顺序是根据参数传递的位置确定的
"""